﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.IO;
using System.Reflection;

namespace MikroMagazaObject
{
    public class Aktarim
    {
        IPos pos;
        Mikro mikro;
        public bool CancelProcess { get; set; }
        public int MagazaNo { get; set; }
        public string SrmMerkezi { get; set; }
        public string OpaPath { get; set; }
        public string KasaCnn { get; set; }
        public string KdvSiralamasi { get; set; }

        public Aktarim(bool interAktar)
        {
            if (interAktar)
            {
                pos = new InterMpos();
            }
            else
            {
                pos = new Genius();
            }
            mikro = new Mikro();
        }

        public IEnumerable<string> Start(DateTime tarih)
        {
            pos.opaPath = OpaPath;
            pos.KasaConn = KasaCnn;
            pos.KdvSiralamasi = KdvSiralamasi;
            int satir = 0;
            CancelProcess = false;
            List<Document> docs = pos.SatisBilgisi(tarih);
            int toplam = docs.Where(x => x.Gecerli == 0).Count();
            using (SqlConnection cn = new SqlConnection(Hafiza.Ctor.ConnectionString))
            {
                cn.Open();
                SqlTransaction trn = cn.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);

                string evrakSeri = "";
                int evrakSira = 0;
                int evrakSatir = mikro.MaxEvrakSatir(EvrakTipleri.PerakendeSatisIrsaliyesi, EvrakSeri(false), Convert.ToInt32(tarih.Year.ToString() + tarih.Month.ToString("00") + tarih.Day.ToString("00")));
                foreach (Document doc in docs.Where(x => x.Gecerli == 0))
                {

                    if (CancelProcess)
                        break;

                    //if (Program.Session[Settings.CariliAyriSatis].ToString() == "Evet")
                    //{
                    //    if (!string.IsNullOrEmpty(doc.MusteriNo))
                    //    {
                    //        evrakSeri = EvrakSeri(true);
                    //        evrakSira = mikro.MaxEvrakNo(EvrakTipleri.PerakendeSatisIrsaliyesi, evrakSeri, Convert.ToInt32(tarih.Year.ToString().Substring(2) + tarih.Month.ToString("00") + tarih.Day.ToString("00") + "000"), Hafiza.Ctor.ConnectionString);
                    //        int satir = 0;
                    //        mikro.SharEkle(doc, trn, evrakSeri, evrakSira, ref satir, SrmMerkezi, MagazaNo);
                    //    }
                    //    else
                    //    {
                    //        evrakSeri = EvrakSeri(false);
                    //        evrakSira = Convert.ToInt32(tarih.Year.ToString() + tarih.Month.ToString("00") + tarih.Day.ToString("00"));
                    //        mikro.SharEkle(doc, trn, evrakSeri, evrakSira, ref evrakSatir, SrmMerkezi, MagazaNo);
                    //    }
                    //}
                    //else
                    //{
                    evrakSeri = EvrakSeri(false);
                    evrakSira = Convert.ToInt32(tarih.Year.ToString() + tarih.Month.ToString("00") + tarih.Day.ToString("00"));
                    if (Hafiza.Ctor.ConnectionString.Contains("V15"))
                    {
                        EvrakTipleri tip = EvrakTipleri.PerakendeSatisIrsaliyesi;
                        if (doc.BelgeTipi == 0)
                        {
                            tip = EvrakTipleri.PerakendeSatisIrsaliyesi;
                        }
                        else
                        {
                            tip = EvrakTipleri.PerakendeSatisIadeIrsaliyesi;
                        }

                        mikro.SharEkleV15(tip, doc, trn, evrakSeri, evrakSira, ref evrakSatir, SrmMerkezi, MagazaNo, MagazaNo);
                    }
                    else
                    {
                        mikro.SharEkleV14(EvrakTipleri.PerakendeSatisIrsaliyesi, doc, trn, evrakSeri, evrakSira, ref evrakSatir, SrmMerkezi, MagazaNo, MagazaNo);
                    }

                    //}

                    satir++;
                    yield return toplam.ToString() + ";" + satir.ToString();
                }
                try
                {
                    if (!CancelProcess)
                    {
                        trn.Commit();
                    }
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.Message);
                    if (ex.InnerException != null)
                        System.Windows.Forms.MessageBox.Show(ex.InnerException.Message);
                }
                finally
                {
                    cn.Close();
                }
            }
            yield return toplam.ToString() + ";" + toplam.ToString();
        }

        public void YenidenAktar(DateTime tarih)
        {
            pos.opaPath = OpaPath;
            pos.KasaConn = KasaCnn;
            CancelProcess = false;
            using (SqlConnection cn = new SqlConnection(Hafiza.Ctor.ConnectionString))
            {
                cn.Open();
                SqlTransaction trn = cn.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);
                int sira = Convert.ToInt32(tarih.Year.ToString() + tarih.Month.ToString("00") + tarih.Day.ToString("00"));
                mikro.EvrakSil(EvrakTipleri.PerakendeSatisIrsaliyesi, EvrakSeri(false), sira, sira, trn);
                sira = Convert.ToInt32(tarih.Year.ToString().Substring(2) + tarih.Month.ToString("00") + tarih.Day.ToString("00") + "000");
                int bit = Convert.ToInt32(tarih.Year.ToString().Substring(2) + tarih.Month.ToString("00") + tarih.Day.ToString("00") + "999");
                mikro.EvrakSil(EvrakTipleri.PerakendeSatisIrsaliyesi, EvrakSeri(true), sira, bit, trn);
            }
        }

        private string EvrakSeri(bool cari)
        {
            if (cari)
                return "CR" + MagazaNo.ToString("00");
            else
                return "ON" + MagazaNo.ToString("00");
        }
    }
}
